package com.xmy.future;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;

/**
 * 异步调用
 *  CompletableFuture<Void> future = CompletableFuture.runAsync(Runnable runnable) 无返回值
 */
public class CompletableFutureTest {
    public static void main(String[] args) throws Exception {
//        CompletableFuture<Void> future = CompletableFuture.runAsync(()->{
//            //休眠2秒
//            try {
//                TimeUnit.SECONDS.sleep(2);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//            System.out.println(Thread.currentThread().getName()+"=>runAsync");
//        });
//        System.out.println("1111");
//        future.get();
        CompletableFuture<Integer> future = CompletableFuture.supplyAsync(()->{
            System.out.println(Thread.currentThread().getName()+"=>supplyAsync");
            int i = 1/0;
            return 1024;
        });
        System.out.println(future.whenComplete((t,u)->{ // future中的任务执行完后的回调
            System.out.println("t=>"+t); //如果没有异常，t为正常的返回结果，否则t为null
            System.out.println("u=>"+u);// 如果没有异常，则u为null，否则u为异常信息
        }).exceptionally((e)->{// future中执行失败时的回调，如果没有异常，则不会调用
            System.out.println(e.getMessage()); // 打印异常信息
            return 233; // 失败返回
        }).get());
    }
}
